package com.bkhech.satoken.controller;

import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * 权限认证，使用编码方式鉴权
 *
 * @author guowm
 * @date 2023/8/3
 */
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("user/permission")
public class UserAuthController {
    @RequestMapping("api")
    public SaResult api() {
        // 获取：当前账号所拥有的权限集合
        final List<String> permissionList = StpUtil.getPermissionList();
        log.info("permissionList: {}", permissionList);
        // 判断：当前账号是否含有指定权限, 返回 true 或 false
        final boolean hasPermission = StpUtil.hasPermission("user.add");
        log.info("hasPermission: {}", hasPermission);
        // 校验：当前账号是否含有指定权限, 如果验证未通过，则抛出异常: NotPermissionException
        StpUtil.checkPermission("user.add");
//        StpUtil.checkPermissionOr();
//        StpUtil.checkPermissionAnd();


        final List<String> roleList = StpUtil.getRoleList();
        log.info("roleList: {}", roleList);
        final boolean hasRole = StpUtil.hasRole("super-admin");
        log.info("hasRole: {}", hasRole);
        // 校验：当前账号是否含有指定角色标识, 如果验证未通过，则抛出异常: NotRoleException
        StpUtil.checkRole("super-admin");
//        StpUtil.checkRoleOr();
//        StpUtil.checkRoleAnd();


        /*
         * 权限通配符 wildcard
         *
         * Sa-Token允许你根据通配符指定泛权限，
         * 例如当一个账号拥有user.art.*的权限时，user.art.add、user.art.delete、user.art.update都将匹配通过
         */
        // 前提条件：在 StpInterface 实现类中，为账号返回了 "user.art.*" 泛权限
        // true
        final boolean artPermission = StpUtil.hasPermission("user.art.add");
        log.info("artPermission: {}", artPermission);
        //false
        final boolean goodPermission = StpUtil.hasPermission("user.good.add");
        log.info("goodPermission: {}", goodPermission);

        // 注意点：
        // 1、上帝权限：当一个账号拥有 "*" 权限时，他可以验证通过任何权限码
        // 2、角色校验也可以加 * ，指定泛角色，例如： "*.admin"，暂不赘述

        return SaResult.ok();
    }

}
